/**
 * https://www.bilibili.com/video/BV1vs411n7TH?p=11
 * 2.C 语言的数据类型(没有 byte 和 boolean)
 * 2.1 常量与变量
 * 2.1.1 关键字

数据类型关键字(12个)
                        ┌─ 整型       : int, short, long
           ┌─ 基本类型 ──┤  字符型      : char
           │            └─ 浮点型(实型): float(单精度实型), double(双精度实型)
           │
           │            ┌─ 数组(类型)  : int[5] arr; char[5] cs;  ...
数据类型： ──┼─ 构造类型 ──┤  结构(类型)  : struct
           │            │  联合(类型)  : union
           │            └─ 枚举(类型)  : enum
           │
           └─ 指针(类型)               : 数据类型 * (例: int *, int ** 等)



数据类型                 长度                                            名称/备注                        取值范围                    备注
01. char              : 1 byte ──────────────────────────────────────────────────────────────────  -2^7 ~ 2^7-1   (-128~127)     //8位, 最高位是符号位
    unsigned char     : 1 byte                                                                     0 ~ 2^8-1      (0~255)       //最高位不算是符号位, 算作正数
02. short             : 2 byte                                                                     -2^15 ~ 2^15-1 (-32768~32767)
    unsigned short    : 2 byte                                                                     0 ~ 2^16-1      (0~65535)
03. int               : 4 byte                                                                     -2^31 ~ 2^31-1 (-2,147,483,648~2,147,483,647)
    unsigned int      : 4 byte                                          无符号(正)整型             0 ~ 2^32-1      (0~4,294,967,295)
04. long              : Windows:4 byte, Linux(32位 4 byte, 64位 8 byte)
    unsigned long     : 4 byte
    long int          :
    unsigned long int :                                                                             0~2^32-1    (0~4294967295)
    long long         : 8 byte                                          C89库中没有, C99库中才有.  -2^63 ~ 2^63-1 (-9,223,372,036,854,775,808~9,223,372,036,854,775,807)
    unsigned long long: 8 byte ──────────────────────────────────────────────────────────────────  0 ~ 2^64-1 (0~18,446,744,073,709,551,615)
05. float             : 4 byte[Windows(32,64)],  unix:8 byte            单精度浮点型
06. double            : 8 byte                                          双精度浮点型
    long double       : 12 byte

07. int array[10]     : 40 byte ─────────────────────────────────────── 数组, 长度 = int长度4 x 10 = 40
08. char *, int *, int **: 4 byte ───────────────────────────────────── 指针
    void              :                                                 空类型, 用于函数返回类型&函数参数
                                                                        void* 万能指针, 可作为函数参数传递任何类型的数据
09. struct Student    : 40 byte ─────────────────────────────────────── 结构体成员需要偏移'内存对齐'
10. union Var         : 16 byte                                         联合体所占的内存长度 = 最长成员长度的倍数, ∴也叫共用体
11. enum Week         :  4 byte                                         枚举(enum只是定义了一个常量集合, 里面没有“元素”, 当做int来存储的, 所以枚举类型的sizeof值都为4)
 */
#include <stdio.h>
#include "../entity/Student.h"
#include "../entity/Union_Var.h"
#include "../entity/enum_Week.h"

static void sizeof_test();

int main(void) {
    int                a = 10;     //10进制
    int                b = 0b1011; //2进制
    int                c = 0123;   //8进制
    int                d = 0x123;  //16进制

    long               e = 10L;
    long long          f = 10LL;
    unsigned int       g = 10U;
    unsigned short     h = 10U;// U 结尾?
    unsigned long      k = 10UL;
    unsigned long long m = 10ULL;

    sizeof_test();
}

static void sizeof_test() {
    printf("各种数据类型&及长度, C语言的数据类型没有byte和boolean, size_t len = sizeof(xx),单位byte.\n");
    int array[9];                                                    //    C语音长度                Java语言        备注
    double* p;
    size_t charLen = sizeof(char);
    printf("01.char               = %d\n", charLen);                //1个字节(-128~127)            2个字节            //长度不一致
    printf("   unsigned char      = %d\n", sizeof(unsigned char));        //1个字节(0~255)
    printf("02.short              = %d\n", sizeof(short));                //2                            2
    printf("   unsigned short     = %d\n", sizeof(unsigned short));    //2
    printf("03.int                = %d\n", sizeof(int));                //4                            4
    printf("   unsigned int       = %d\n", sizeof(unsigned int));        //4(最高位不算是符号位, 算作正数)
    printf("04.long               = %d\n", sizeof(long));                //window(32,64):4, unix:8    8                //长度不一致
    printf("   unsigned long      = %d\n", sizeof(unsigned long));        //4
    printf("   long long          = %d\n", sizeof(long long));            //8(32系统中,CPU寄存器是32位,计算效率低)
    printf("   unsigned long long = %d\n", sizeof(unsigned long long));//8
    printf("05.float              = %d\n", sizeof(float));                //4                            4
    printf("06.double             = %d\n", sizeof(double));            //8                            8
    printf("   long double        = %d\n", sizeof(long double));        //8
    printf("07.int array[9]       = %d\n", sizeof(array));                //4 * 9 = 36
    printf("08.p指针长度           = %d[if(操作系统&编译器都是64位) 长度=8]\n", sizeof(p));//4/8
    printf("09.struct Student结构体= %d(结构体成员需要偏移'内存对齐')\n", sizeof(struct Student));//40
    printf("10.union Var(联合体)   = %d(联合体所占的内存长度 = 最长成员长度的倍数, ∴也叫共用体)\n", sizeof(union Var));//16
    printf("11.enum Week(枚举)     = %d(enum只是定义了一个常量集合, 里面没有“元素”, 当做int来存储的, 所以枚举类型的sizeof值都为4)\n", sizeof(enum Week));//4
}
